home *** CD-ROM | disk | FTP | other *** search
/ Network Support Library / RoseWare - Network Support Library.iso / apidev / netman.arc / LEADER.PAS < prev    next >
Pascal/Delphi Source File  |  1989-05-22  |  6KB  |  351 lines

  1. {$define WEAVE}
  2.  
  3. program Leader;
  4.  
  5. uses Drivers, Graph, DOS, CRT;
  6.  
  7. const GraphMode = MCGAC0;
  8.       GraphDriver = MCGA;
  9.       Block = 50;
  10.       ScreenMap = $b800;
  11.       BitsPerHue = 2;
  12.       Threshold = 4;
  13.       Path='.';
  14.       Painting = 'FRACTAL.DAT';
  15.       Framework = 'VALUES.DAT';
  16.  
  17. {$ifdef WEAVE}
  18.       Interlace = true;
  19.       ScreenMap2 = $ba00;
  20.       HalfLine = 100;
  21. {$else}
  22.       Interlace = false;
  23. {$endif}
  24.  
  25. const No_Error = $00;
  26.       Not_Found = $02;
  27.       Access_Denied = $05;
  28.  
  29. const Read_Only = $00;
  30.       Write_Only = $01;
  31.       Read_Write = $02;
  32.       Deny_All = $10;
  33.       Deny_Write = $20;
  34.       Deny_Read = $30;
  35.       Deny_None = $40;
  36.  
  37. type Border = (Upper, Lower, Leftmost, Rightmost);
  38.      Count_Type = byte;
  39.      Size_Type = word;
  40.      Real_Type = real;
  41.  
  42. var Hues: byte;
  43.     Fence: array[Border] of Real_Type;
  44.  
  45. procedure Arrive;
  46.  
  47. procedure Property;
  48.  
  49. var Xasp,
  50.     Yasp: word;
  51.     Width,
  52.     Height: longint;
  53.     Adjust: real;
  54.  
  55. begin
  56. GetAspectRatio(Xasp, Yasp);
  57. Width:=(GetMaxX + 1) * Xasp;
  58. Height:=(GetMaxY + 1) * Yasp;
  59. if Width > Height
  60. then begin
  61.      Adjust:=2 * (Width / Height);
  62.      Fence[Upper]:=2;
  63.      Fence[Lower]:=-2;
  64.      Fence[Leftmost]:=-Adjust;
  65.      Fence[Rightmost]:=Adjust;
  66.      end
  67. else begin
  68.      Adjust:=2 * (Height / Width);
  69.      Fence[Upper]:=Adjust;
  70.      Fence[Lower]:=-Adjust;
  71.      Fence[Leftmost]:=-2;
  72.      Fence[Rightmost]:=2;
  73.      end;
  74. end;
  75.  
  76. var Mode,
  77.     Driver,
  78.     Result: integer;
  79.  
  80. begin
  81. Mode:=GraphMode;
  82. Driver:=GraphDriver;
  83. Result:=RegisterBGIdriver(@CGADriverProc);
  84. InitGraph(Driver, Mode, Path);
  85. Hues:=GetMaxColor + 1;
  86. Property;
  87. end;
  88.  
  89. type Shape = record
  90.                Sound: boolean;
  91.                ForeV,
  92.                RearV: Size_Type;
  93.  
  94.                H,
  95.                V: Size_Type;
  96.                Most: Count_Type;
  97.                BitPixel,
  98.                PixelByte: byte;
  99.                ByteLine: word;
  100.                Top,
  101.                Left,
  102.                YInc,
  103.                XInc: Real_Type;
  104.                Weave: boolean;
  105.              end;
  106.  
  107. var Seed: Shape;
  108.     Canvas: file;
  109.  
  110. const Outgoing = true;
  111.       Incoming = false;
  112.  
  113. {$ifdef WEAVE}
  114.  
  115. procedure Door(Outgoing: boolean);
  116.  
  117. var Size: word;
  118.     Screen: pointer;
  119.  
  120. begin
  121. Screen:=Ptr(ScreenMap, $0);
  122. with Seed
  123. do begin
  124.    Size:=Block * ByteLine;
  125.    if Outgoing
  126.    then begin
  127.         Rewrite(Canvas, ByteLine);
  128.         BlockWrite(Canvas, Screen^, HalfLine);
  129.         Screen:=Ptr(ScreenMap2, 0);
  130.         BlockWrite(Canvas, Screen^, HalfLine);
  131.         end
  132.    else begin
  133.         FileMode:=Read_Only + Deny_None;
  134.         Reset(Canvas, ByteLine);
  135.         BlockRead(Canvas, Screen^, HalfLine);
  136.         Screen:=Ptr(ScreenMap2, 0);
  137.         BlockRead(Canvas, Screen^, HalfLine);
  138.         end;
  139.    end;
  140. Close(Canvas);
  141. end;
  142.  
  143. {$else}
  144.  
  145. procedure Door(Outgoing: boolean);
  146.  
  147. var Size: word;
  148.     Lines: Size_Type;
  149.     Screen: pointer;
  150.  
  151. begin
  152. Screen:=Ptr(ScreenMap, $0);
  153. with Seed
  154. do begin
  155.    Size:=Block * ByteLine;
  156.    if Outgoing
  157.    then Rewrite(Canvas, ByteLine)
  158.    else begin
  159.         FileMode:=Read_Only + Deny_None;
  160.         Reset(Canvas, ByteLine);
  161.         end;
  162.    Lines:=V1;
  163.    repeat
  164.      if Outgoing
  165.      then BlockWrite(Canvas, Screen^, Block)
  166.      else BlockRead(Canvas, Screen^, Block);
  167.      Inc(longint(Screen), Size);
  168.      Dec(Lines, Block);
  169.    until (Lines = 0)
  170.    end;
  171. Close(Canvas);
  172. end;
  173.  
  174. {$endif}
  175.  
  176. procedure Blend;
  177.  
  178. begin
  179. end;
  180.  
  181. procedure Cultivate;
  182.  
  183. const On = true;
  184.       Off = false;
  185.  
  186. procedure Plant;
  187.  
  188. const BitByte = 8;
  189.  
  190. var Notice: file of Shape;
  191.  
  192. begin
  193. with Seed
  194. do begin
  195.    Sound:=Off;
  196.    V:=GetMaxY + 1;
  197.    ForeV:=V;
  198.    RearV:=V;
  199.    H:=GetMaxX + 1;
  200.    Most:=Threshold;
  201.    BitPixel:=BitsPerHue;
  202.    PixelByte:=BitByte div BitPixel;
  203.    ByteLine:=H div PixelByte;
  204.    Top:=Fence[Upper];
  205.    Left:=Fence[Leftmost];
  206.    YInc:=(Fence[Upper] - Fence[Lower]) / V;
  207.    XInc:=(Fence[Rightmost] - Fence[Leftmost]) / H;
  208.    Weave:=Interlace;
  209.    end;
  210. Assign(Canvas, Painting);
  211. Door(Outgoing);
  212. Assign(Notice, Framework);
  213. Rewrite(Notice);
  214. Write(Notice, Seed);
  215. Close(Notice);
  216. end;
  217.  
  218. procedure Grow;
  219.  
  220. type Header = record
  221.                 Sound: boolean;
  222.                 AtV,
  223.                 ToV: Size_Type;
  224.               end;
  225.  
  226. var Eye: file of Header;
  227.  
  228. procedure Ready;
  229.  
  230. begin
  231. FileMode:= Read_Write + Deny_None;
  232. Assign(Eye, Framework);
  233. end;
  234.  
  235. var Line: string;
  236.  
  237. function Ripe: boolean;
  238.  
  239. var Result: word;
  240.     Place: Header;
  241.  
  242. begin
  243. {$i-}
  244. Reset(Eye);
  245. {$i+}
  246. Result:=IOResult;
  247. if (Result = No_Error)
  248. then begin
  249.      Read(Eye, Place);
  250.      Close(Eye);
  251.      Str(Place.AtV, Line);
  252.      end;
  253. Ripe:=(Result = Not_Found);
  254. end;
  255.  
  256. const Time = 500;
  257.  
  258. begin
  259. Ready;
  260. Line:='';
  261. repeat
  262.   SetColor(White);
  263.   OutTextXY(0,0,Line);
  264.   Delay(Time);
  265.   SetColor(Black);
  266.   OutTextXY(0,0,Line);
  267. until Ripe;
  268. end;
  269.  
  270. procedure Harvest;
  271.  
  272. begin
  273. Door(Incoming);
  274. end;
  275.  
  276. begin
  277. Plant;
  278. Grow;
  279. Harvest;
  280. end;
  281.  
  282. procedure NewRegion;
  283.  
  284. const Step = 4;
  285.  
  286. const Scan = #0;
  287.       Enter = #13;
  288.       Up = #72;
  289.       Down = #80;
  290.       Left = #75;
  291.       Right = #77;
  292.       Reduce = #115;
  293.       Enlarge = #116;
  294.  
  295. var Key: char;
  296.     Xasp,
  297.     Yasp: word;
  298.     X,
  299.     Y,
  300.     Width,
  301.     Height: Size_Type;
  302.     Ratio: Real_Type;
  303.  
  304. begin
  305. X:=GetMaxX div 2;
  306. Y:=GetMaxY div 2;
  307. Width:=GetMaxX div 2;
  308. Ratio:=Seed.V / Seed.H;
  309. SetWriteMode(XORPut);
  310. SetColor(Random(GetMaxColor) + 1);
  311. repeat
  312.   Height:=round(Width * Ratio);
  313.   Rectangle(X - Width, Y - Height, X + Width, Y + Height);
  314.   Key:=ReadKey;
  315.   Rectangle(X - Width, Y - Height, X + Width, Y + Height);
  316.   if Key = Scan
  317.   then begin
  318.        Key:=ReadKey;
  319.        case Key
  320.        of Up: Dec(Y, Step);
  321.           Left: Dec(X, Step);
  322.           Right: Inc(X, Step);
  323.           Down: Inc(Y, Step);
  324.           Reduce: Dec(Width, Step);
  325.           Enlarge: Inc(Width, Step);
  326.        end;
  327.        end;
  328. until Key = Enter;
  329. Fence[Upper]:=Fence[Upper] - Seed.YInc * (Y - Height);
  330. Fence[Lower]:=Fence[Lower] + Seed.YInc * (GetMaxY - Y - Height);
  331. Fence[Leftmost]:=Fence[Leftmost] + Seed.XInc * (X - Width);
  332. Fence[Rightmost]:=Fence[Rightmost] - Seed.XInc * (GetMaxX - X - Width);
  333. end;
  334.  
  335. procedure Depart;
  336.  
  337. begin
  338. CloseGraph;
  339. end;
  340.  
  341. var key:char;
  342.  
  343. begin
  344. Arrive;
  345. repeat
  346.   Cultivate;
  347.   NewRegion;
  348. until false;
  349. Depart;
  350. end.
  351.